#-*- coding: utf-8 -*-
import os
import pandas as pd
from random import shuffle

datafile = '../data/model.xlsx'
data = pd.read_excel(datafile)
data = data.values
shuffle(data)

p = 0.8  #设置训练数据比例
train = data[:int(len(data)*p), :]
test = data[int(len(data)*p):, :]

###构建神经网络分类模型
from keras.models import Sequential #导入神经网络初始化函数
from keras.layers import Dense, Activation #导入神经网络层函数、激活函数

netfile = '../tmp/net.h5' #构建的神经网络模型存储路径

net = Sequential() #建立神经网络
net.add(Dense(input_dim = 3, units = 10)) #添加输入层（3节点）到第一个隐藏层（10节点）的连接
net.add(Activation('relu')) #第一个隐藏层使用relu激活函数
net.add(Dense(input_dim = 10, units = 10))#添加第一个隐藏层（10节点）到第二个隐藏层（10节点）的连接
net.add(Activation('relu')) #第二个隐藏层使用relu激活函数
net.add(Dense(input_dim = 10, units = 1)) #添加第二个隐藏层（10节点）到输出层（1节点）的连接
net.add(Activation('sigmoid')) #输出层使用sigmoid激活函数
net.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics=['accuracy']) #编译模型，使用adam方法求解

net.fit(train[:, :3], train[:, 3], epochs=500, batch_size=1) #训练模型
net.save(netfile) # 保存整个模型（包括结构和参数）
predict_result = net.predict_classes(train[:, :3]).reshape(len(train)) #预测结果变形

from sklearn.metrics import confusion_matrix #导入混淆矩阵函数
cm_lm = confusion_matrix(train[:, 3], predict_result) #混淆矩阵
#输出准确率
import numpy as np
diagonal_sum = np.sum(np.diag(cm_lm))# 计算混淆矩阵对角线元素之和
total_data = np.sum(cm_lm)  # 计算总数据量
accuracy = diagonal_sum / total_data # 计算分类准确率
print("神经网络分类准确率: ", '{:.2%}'.format(accuracy))# 在控制台输出分类准确率
#混淆矩阵可视化
import matplotlib.pyplot as plt #导入作图库
plt.matshow(cm_lm, cmap=plt.cm.Blues) #画混淆矩阵图，配色风格使用cm.Greens
plt.colorbar() #颜色标签
for x in range(len(cm_lm)): #数据标签
  for y in range(len(cm_lm)):
    plt.annotate(cm_lm[x, y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
plt.ylabel('True label') #坐标轴标签
plt.xlabel('Predicted label') #坐标轴标签
plt.title('Neural Network')
plt.show()#显示作图结果

from sklearn.tree import DecisionTreeClassifier #导入决策树模型
treefile = '../tmp/tree.pkl' #模型输出名字
tree = DecisionTreeClassifier() #建立决策树模型
tree.fit(train[:, :3],train[:, 3]) #训练
#保存模型
import joblib
joblib.dump(tree, treefile)
#显示决策树混淆矩阵和分类准确率
cm_dt = confusion_matrix(train[:, 3], tree.predict(train[:, :3])) #混淆矩阵
#输出准确率
diagonal_sum = np.sum(np.diag(cm_dt))# 计算混淆矩阵对角线元素之和
total_data = np.sum(cm_dt)  # 计算总数据量
accuracy = diagonal_sum / total_data # 计算分类准确率
print("决策树分类准确率: ", '{:.2%}'.format(accuracy))# 在控制台输出分类准确率
#混淆矩阵可视化
plt.matshow(cm_dt, cmap=plt.cm.Greens) #画混淆矩阵图，配色风格使用cm.Greens
plt.colorbar() #颜色标签
for x in range(len(cm_dt)): #数据标签
  for y in range(len(cm_dt)):
    plt.annotate(cm_dt[x, y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
plt.ylabel('True label') #坐标轴标签
plt.xlabel('Predicted label') #坐标轴标签
plt.title('Decision Tree')
plt.show()#显示作图结果

from sklearn.metrics import roc_curve,auc #导入ROC曲线函数
fpr1, tpr1, thresholds1 = roc_curve(test[:, 3], net.predict(test[:, :3]).reshape(len(test)), pos_label=1)
auc1=auc(fpr1,tpr1)
fpr2, tpr2, thresholds2 = roc_curve(test[:, 3], tree.predict_proba(test[:, :3])[:, 1], pos_label=1)
auc2=auc(fpr2,tpr2)
print("神经网络的ROC曲线AUC值是：",'{:.4}'.format(auc1))
print("决策树的ROC曲线AUC值是",'{:.4}'.format(auc2))
plt.subplot(1, 2, 1)
plt.plot(fpr1, tpr1, linewidth=2, label = 'ROC of Neural Network', color = 'blue') #作出ROC曲线
plt.xlabel('False Positive Rate') #坐标轴标签
plt.ylabel('True Positive Rate') #坐标轴标签
plt.ylim(0, 1.05) #边界范围
plt.xlim(0, 1.05) #边界范围
plt.legend(loc=4) #图例
plt.title('ROC of Neural Network')
plt.subplot(1, 2, 2)
plt.plot(fpr2, tpr2, linewidth=2, label = 'ROC of Decision Tree', color = 'green')
plt.xlabel('False Positive Rate') #坐标轴标签
plt.ylabel('True Positive Rate') #坐标轴标签
plt.ylim(0, 1.05) #边界范围
plt.xlim(0, 1.05) #边界范围
plt.legend(loc=4) #图例
plt.title('ROC of Decision Tree')
plt.show()#显示作图结果